---
title: O 与 R 两个世界
sidebar_position: 0
---
## O 和 R
自有编程语言以来，一共出现过三种编程范式：<RedSpan>结构化编程（Structured Programming）、面向对象编程（Object-oriented Programming）和函数式编程（Functional Programming）</RedSpan>。结构化编程已经是明日黄花，函数式编程是后起之秀，而面向对象编程范式任然是当今占统治地位的编程范式。
在现在仍然存活的编程语言中，除了 C 语言还是采用结构化编程范式之外，绝大多数都是采用面向对象的编程范式，包括广为流行的 Java、C#、C++ 等等。

任何企业软件的核心都是业务逻辑的组织和实现，Martin Flower 在著名的《企业应用架构模式》一书中对于业务逻辑的组织提出了四种模式：<RedSpan>Transaction Script（事务脚本），Table Model（表模块）、Active Record（活动记录）及 Domain Model（领域模型）。</RedSpan>
事务脚本是面向过程的，表模块和活动记录是面向数据的，而领域模型是面向对象的。如果使用面向对象的编程语言来编写程序的化，采纳面向对象的领域模型来组织和实现业务无疑是最佳选择。

面向对象的企业应用以领域模型而不是数据模型为核心进行分析、设计和实现。领域模型中的领域对象包含各种实体和值对象，持有企业数据并实现业务逻辑。面向对象的核心特征是继承、封装和多态，而对象之间可以有依赖、关联、泛化、聚合、组合和实现等关系，领域模型支持所有这些特征和关系。

如果运行企业应用的服务器内存无限大而且永不停机，理论上只需要以面向对象的编程语言编写的程序，而不需要任何形式的数据库。所有的数据都由程序中的对象以字段值的形式持有，并可以通过调用对象上的方法获得这些数据。
但是，由于以下一些重要原因，我们还是需要一个数据库来存储业务数据：
* 服务器内存不可能无限大
* 服务器不可能永不停机
* 需要和其它应用共享数据
* 服务器集群的需要

因此，我们必然需要将应用程序中的数据持久化到某种形式的数据库中，以节省内存，并在服务器重启后将数据恢复到内存中，同时提供给集群的应用服务器和第三方应用进行共享访问。

按理说，面向对象的编程语言只有和面向对象的数据库才能配合无间。但现实是：虽然目前有一些面向对象的数据库系统，但都远没有达到成熟可用的程度，目前占统治地位的任然是关系数据库系统。因此，至少在可预见的未来，前端的面向对象的编程语言与后端的关系数据库仍然是最优组合。
但是对象模型和关系模型是根据不同的理论，面向不同的意图设计的，两者在很多方面并不匹配，这就是所谓的 <RedSpan>对象——关系阻抗失配</RedSpan>。为了让两者适配，我们需要编写相应的转换代码，在对象模型和关系模型之间进行双向映射。

Java Persistence API ，简称 JPA，是一个官方的 <RedSpan>对象/关系映射（Object/Relational Mapping，简称 ORM）规范</RedSpan>，它能够在对象模型和关系模式之间进行双向转换，目的是解决对象-关系阻抗失配问题，使面向对象的领域模型与面向关系的数据模型能够和谐共处。Hibernate 是 JPA 规范的一个实现。我们可以针对 JPA 规则进行编程，而将 Hibernate 隐藏在幕后，负责在运行时执行真正的对象关系映射操作。


